﻿using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Resources;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Scheduler;
using Microsoft.Phone.Shell;
using MusicAlarm7.Model;
using MusicAlarm7.ViewModel;
using MusicAlarm7.Resources;

namespace MusicAlarm7
{
    //TODO: RecurringDaysPicker总是显示不正确的问题，ps：该控件是开放源码的，似乎是由于控件创建时的语言不正确。
    public partial class App : Application
    {
        /// <summary>
        ///提供对电话应用程序的根框架的轻松访问。
        /// </summary>
        /// <returns>电话应用程序的根框架。</returns>
        public PhoneApplicationFrame RootFrame { get; private set; }

        private static AlarmViewModel viewModel;
        public static AlarmViewModel ViewModel
        {
            get { return viewModel; }
        }


        /// <summary>
        /// Application 对象的构造函数。
        /// </summary>
        public App()
        {
            // Global handler for uncaught exceptions. 
            UnhandledException += Application_UnhandledException;

            // Standard Silverlight initialization
            InitializeComponent();

            // 特定于电话的初始化
            InitializePhoneApplication();

            // 调试时显示图形分析信息。
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 显示当前帧速率计数器。
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // 显示在每个帧中重绘的应用程序区域。
                //Application.Current.Host.Settings.EnableRedrawRegions = true；

                // Enable non-production analysis visualization mode, 
                // 该模式显示递交给 GPU 的包含彩色重叠区的页面区域。
                //Application.Current.Host.Settings.EnableCacheVisualization = true；

                // Disable the application idle detection by setting the UserIdleDetectionMode property of the
                // application's PhoneApplicationService object to Disabled.
                //  注意: 仅在调试模式下使用此设置。禁用用户空闲检测的应用程序在用户不使用电话时将继续运行
                // 并且消耗电池电量。
                PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
            }

#if DEBUG
            //清理所有本程序设置的闹钟
            foreach (Alarm a in ScheduledActionService.GetActions<Alarm>())
            {
                System.Diagnostics.Debug.WriteLine("Removed alarm: " + a.Name);
                ScheduledActionService.Remove(a.Name);
            }
#endif

            string DBConnectionString = "Data Source=isostore:/alarm.sdf";
            using (AlarmDataContext db = new AlarmDataContext(DBConnectionString))
            {
#if DEBUG
                if (db.DatabaseExists()) db.DeleteDatabase();
                //if (db.DatabaseExists())
                //{
                //    var notis = from noti in db.Notifications select noti;
                //    db.Notifications.DeleteAllOnSubmit(notis);
                //    db.SubmitChanges();
                //    var alarms = from alarm in db.Items select alarm;
                //    db.Items.DeleteAllOnSubmit(alarms);
                //    db.SubmitChanges();
                //}
#endif
                if (db.DatabaseExists() == false)
                {
                    try
                    {
                        db.CreateDatabase();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Create database failed: " + ex.Message);
                        if (db.DatabaseExists() == true) db.DeleteDatabase();
                    }
                }
            }

            viewModel = new AlarmViewModel(DBConnectionString);
            viewModel.LoadAlarmsFromDatabase();
        }

        // 应用程序启动(例如，从“开始”菜单启动)时执行的代码
        // 此代码在重新激活应用程序时不执行
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {

        }

        // 激活应用程序(置于前台)时执行的代码
        // 此代码在首次启动应用程序时不执行
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
        }

        // 停用应用程序(发送到后台)时执行的代码
        // 此代码在应用程序关闭时不执行
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
        }

        // 应用程序关闭(例如，用户点击“后退”)时执行的代码
        // 此代码在停用应用程序时不执行
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
        }

        // 导航失败时执行的代码
        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 导航已失败；强行进入调试器
                System.Diagnostics.Debugger.Break();
            }
        }

        // 出现未处理的异常时执行的代码
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 出现未处理的异常；强行进入调试器
                System.Diagnostics.Debugger.Break();
            }
        }

        #region 电话应用程序初始化

        // 避免双重初始化
        private bool phoneApplicationInitialized = false;

        // 请勿向此方法中添加任何其他代码
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // 创建框架但先不将它设置为 RootVisual；这允许初始
            // 屏幕保持活动状态，直到准备呈现应用程序时。
            RootFrame = new PhoneApplicationFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // 处理导航故障
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // 确保我们未再次初始化
            phoneApplicationInitialized = true;
        }

        // 请勿向此方法中添加任何其他代码
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // 设置根视觉效果以允许应用程序呈现
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // 删除此处理程序，因为不再需要它
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }

        #endregion
    }

    public sealed class AppTile
    {
        public static void Update()
        {
            ShellTile tile = ShellTile.ActiveTiles.First();
            StandardTileData data = new StandardTileData();
            TimeSpan eta = TimeSpan.MaxValue;

            foreach (AlarmItem a in App.ViewModel.Alarms)
            {
                if (a.Eta < eta) eta = a.Eta;
            }

            RelativeTimeConverter conv = new RelativeTimeConverter();

            data.Title = AppResources.Tile_NextAlarm + conv.Convert(DateTime.Now + eta, typeof(string), null, System.Globalization.CultureInfo.CurrentCulture).ToString();

            tile.Update(data);
        }

        public static void SetSchedule()
        {
            
        }
    }
}